package xs.szw.service.service.sercurity;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.stream.StreamUtil;
import cn.hutool.core.util.StrUtil;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import xs.szw.common.constant.RedisKeyConstant;
import xs.szw.service.utils.RedisCache;
import xs.szw.service.utils.SecurityUtils;

import java.util.*;

/**
 * @program: xs_oa
 * @description:   SpringSecurity 权限校验
 * @author: Songzw
 * @create: 2025-02-11 15:02
 **/
@Component("ss")
@Slf4j
@RequiredArgsConstructor
public class PermissionService {


    private final RedisCache redisCache;

    /**
     * 判断当前登录用户是否拥有操作权限
     * @param permission
     * @return
     */
    public boolean hasPerm(String permission){
        //判断是否空
        if(StrUtil.isBlank(permission)){
            return false;
        }
        //判断是否是超级管理员
        if(SecurityUtils.isRoot()){
            return true;
        }
        // 获取当前登录用户的角色编码集合
        Set<String> roleCodes = SecurityUtils.getRoles();
        if (CollectionUtil.isEmpty(roleCodes)) {
            return false;
        }
        // 获取角色权限列表
        Set<String> rolePerms = getRolePermsFromCache(roleCodes);

        // 判断当前用户是否拥有操作权限
        return rolePerms.contains(permission);
    }


    /**
     * 从缓存中获取角色权限列表
     *
     * @param roleCodes 角色编码集合
     * @return 角色权限列表
     */
    public Set<String> getRolePermsFromCache(Set<String> roleCodes) {
        // 检查输入是否为空
        if (CollectionUtil.isEmpty(roleCodes)) {
            return Collections.emptySet();
        }

        Set<String> perms = new HashSet<>();
        // 从缓存中一次性获取所有角色的权限
        Collection<Object> roleCodesAsObjects = new ArrayList<>(roleCodes);


        List<Object> permsList = redisCache.getMultiCacheMapValue(RedisKeyConstant.ROLE_PERMS_PREFIX, roleCodesAsObjects);
        for (Object rolePermsObj : permsList) {
            if (rolePermsObj instanceof Set) {
                @SuppressWarnings("unchecked")
                Set<String> rolePerms = (Set<String>) rolePermsObj;
                perms.addAll(rolePerms);
            }
        }

        return perms;
    }
}

